// 类
class Person{
    constructor(name,age){
        this.name=name,
        this.age=age
    }

    // getter取值函数-->n属于独立属性
    get n(){
        return this.name
    }

    // setter存值函数
    set n(value){
        this.name=value
    }

    say(){
        console.log('用于继承测试');
    }

    s(){
        console.log('用于测试子类supper');
    }
}
var p=new Person('小李')
console.log(p.n);
p.n='小蒋'
console.log(p.n);


// 继承
// ES6 规定，子类必须在constructor()方法中调用super()，否则就会报错，这是因为子类自己的this对象，必须先通过父类的构造函数完成塑造，得到与父类同样的实例属性和方法，然后再对其进行加工，添加子类自己的实例属性和方法。
// 如果不调用super()方法，子类就得不到自己的this对象
// uper这个关键字，既可以当作函数使用，也可以当作对象使用。在这两种情况下，它的用法完全不同
class PersonChild extends Person{
    constructor(name,sex){
        // super作为函数调用时，代表父类的构造函数。ES6 要求，子类的构造函数必须执行一次super函数。
        //super必须放在第一行
        super(name);
        this.sex=sex;
    }
    say(){
        console.log('父类子类同时拥有一个相同方法是遵循就近原则');
    }
    // super作为对象时，在普通方法中，指向父类的原型对象
    getS(){
        super.s();  //-->调用父类的s()方法
    }
} 

var child = new PersonChild();
child.say();
var child1=new PersonChild("小李和小蒋")
console.log(child1.name);
child1.say();  //-->就近原则
child1.getS();
